package com.lantosec.hmrp.modules.workflow.service;

import com.lantosec.hmrp.core.kit.Result;
import com.lantosec.hmrp.modules.system.vo.UserQueryVO;
import com.lantosec.hmrp.modules.workflow.vo.*;
import org.flowable.task.api.Task;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 工作流管理控制
 */
public interface IWorkflowRuntimeService {

    /**
     * 通过流程定义的KEY启动流程实例(带变量)
     *
     * @param processInstanceKey 流程定义的KEY
     * @return 返回流程实例ID
     */
    Result<String> startProcessInstanceByKeyHasVariables(String processInstanceKey, Map<String, Object> map);

    /**
     * 保存流程任务
     * @param saveProcessTaskVO    保存流程对象
     * @return
     */
    FlowTaskVO saveFormData(SaveProcessTaskVO saveProcessTaskVO);

    /**
     * 保存流程任务
     * @param saveProcessTaskVO    保存流程对象
     * @return
     */
    Result<Void> save(SaveProcessTaskVO saveProcessTaskVO);

    /**
     * 作废流程
     *
     */
    Result<Void> deleteProcessInstance(DeleteProcessInstanceVO deleteVO);

    /**
     * 指派任务的操作人或者候选人
     *
     * @param appointTaskVO 指派用户对象
     *
     */
    void appointTask(HandleTaskVO appointTaskVO);

    /**
     * 转发，把操作人删除，改成候选人，然后添加另外一个候选人
     *
     * @param copyTaskVO 转发用户对象
     *
     */
    void transmitTask(HandleTaskVO copyTaskVO);

    /**
     * 将此任务的所有权转移给其他用户。不检查标识组件是否知道用户。
     *
     * @param taskId   任务的taskId，不能为空
     * @param assignee 要用作分配者的用户的用户标识
     */
    void setTransfers(String taskId, String assignee);

    /**
     * 设置流程变量(绑定任务)用Map形式
     *
     * @param taskId 任务ID
     * @param map    流程量
     */
    void setVariablesByTaskIdAsMap(String taskId, Map<String, Object> map);

    /**
     * 设置流程变量(不绑定任务)
     *
     * @param taskId 任务ID
     * @param key
     * @param value
     */
    void setVariablesByTaskId(String taskId, String key, String value);

    /**
     * 移除流程变量(从正在运行中)
     *
     * @param processInstanceId 流程实例ID
     * @param key
     */
    void removeVariablesByProcessInstanceId(String processInstanceId, String key);

    /**
     * 回退流程任务
     * @param backVO
     */
    void backTask(BackProcessInstanceVO backVO);

    /**
     * 设置任务节点转发设置（知会/抄送）
     * @param task      任务信息
     * @param relay     转发配置，保存在流程模型的节点属性上
     * @param userId    用户Id
     * @param userList  指派类型为人工时，用户在前端指定的用户列表
     * @param isDefault 是否默认转发
     */
    void setTaskRelay(Task task, String relay, String userId, List<UserQueryVO> userList, Boolean isDefault);
}
